﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SW2A311A
{
    class StockObserver
    {
        #region Instansvariabler
        // StockObserver holder på vores minimum værdier til de forskellige produkter før der skal gøres opmærksom på der er for få på lager.
        private int HoodMinimum { get; set; }
        private int VentingDryerMinimum { get; set; }
        private int CondensingDryerMinimum { get; set; }
        private int MicrowaveMinimum { get; set; }
        private int BuiltInOvenMinimum { get; set; }
        #endregion

        #region Constructor
        // Vi har kun en Constructor der udfylder alle fields da de skal bruges så snart et event bliver
        // startet med Add eller Remove metoderne i objekter af StockCollection-klassen.
        public StockObserver(int hoodMinimum, int ventingDryerMinimum,
            int condensingDryerMinimum, int microwaveOvenMinimum, int builtInOvenMinimum)
        {
            if (hoodMinimum <= 0 || ventingDryerMinimum <= 0 ||
                condensingDryerMinimum <= 0 || microwaveOvenMinimum <= 0 || builtInOvenMinimum <= 0)
                throw new ArgumentOutOfRangeException("Alle felter skal instantieres");

            HoodMinimum = hoodMinimum;
            VentingDryerMinimum = ventingDryerMinimum;
            CondensingDryerMinimum = condensingDryerMinimum;
            MicrowaveMinimum = microwaveOvenMinimum;
            BuiltInOvenMinimum = builtInOvenMinimum;
        }
        #endregion

        #region Metoder
        // Når Subscribe kaldes vil der blive abboneret på eventhandleren fra objektet af StockCollection-klassen der 
        // refereres til med indput parameteren.
        internal void Subscribe(StockCollection sm)
        {
            sm.OnStockChange += OnStockChanged;   // OnStockChanged metoden sættes til at blive kaldt når et event startes.
        }

        // OnStockChanged sammenligner det Product og tilhørende int (NumberOfProduct) med vores erklærede minimumsværdier
        // og ved for lavt antal af et Product kaldes PrintStockInfo.
        public void OnStockChanged(object sender, StockCollectionArgs args)
        {
            if (args.Product.Product is Hood &&
                args.Product.NumberOfProduct < HoodMinimum)
                PrintStockInfo(args.Product.NumberOfProduct, args.Product.Product, HoodMinimum);
            else if (args.Product.Product is VentingDryer &&
                args.Product.NumberOfProduct < VentingDryerMinimum)
                PrintStockInfo(args.Product.NumberOfProduct, args.Product.Product, VentingDryerMinimum);
            else if (args.Product.Product is CondensingDryer &&
                args.Product.NumberOfProduct < CondensingDryerMinimum)
                PrintStockInfo(args.Product.NumberOfProduct, args.Product.Product, CondensingDryerMinimum);
            else if (args.Product.Product is MicrowaveOven &&
                args.Product.NumberOfProduct < MicrowaveMinimum)
                PrintStockInfo(args.Product.NumberOfProduct, args.Product.Product, MicrowaveMinimum);
            else if (args.Product.Product is BuiltInOven &&
                args.Product.NumberOfProduct < BuiltInOvenMinimum)
                PrintStockInfo(args.Product.NumberOfProduct, args.Product.Product, BuiltInOvenMinimum);
        }

        // Printer mængden af et Product og dets beskrivelse til consollen.  
        private void PrintStockInfo(int numberOfItem, Product item, int wantedNumber)
        {
            Console.WriteLine(">>>WARNING:<<< Stock has {0} out of {1} required of \n{2}\n", numberOfItem, wantedNumber, item.ToString());

        }
        #endregion
    }
}
